package cn.qdhlm.collectservice.core.component.command;


import cn.qdhlm.collectservice.common.Constant;
import cn.qdhlm.collectservice.common.util.CodeUtil;
import cn.qdhlm.collectservice.common.util.ComUtil;
import cn.qdhlm.collectservice.common.util.JsonUtil;
import cn.qdhlm.collectservice.model.dto.CommandParamDTO;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import lombok.extern.log4j.Log4j2;

/**
 * @Name: AnyAfn0c
 * @Description: 请求1类数据（AFN=0CH）
 * @Author: jiangcs
 */
@Log4j2
public class CmdAfn0c {
    /**
     * 读单个终端实时信息
     *
     * @param sn
     * @param commandParamDTO
     * @return
     */
    public static ByteBuf f30(int sn, CommandParamDTO commandParamDTO) {
        if (ComUtil.isEmpty(commandParamDTO.getTerminalNo())) {
            log.error("f30 参数不合法:{}", JsonUtil.safeJsonStr(commandParamDTO));
            return null;
        }

        ByteBuf byteBuf = Unpooled.buffer(20);
        // DT=> F30
        byteBuf.writeShort(0x2003);
        // SN
        byteBuf.writeShort(sn);
        // terminalNo
        byteBuf.writeBytes(CodeUtil.hexStringToByteArray(CodeUtil.asciiStringToHexString(commandParamDTO.getTerminalNo())));
        // 不够16位，填充 0x00
        int needFillZeroCount = Constant.BYTE_LENGTH_TERMINAL_NO - commandParamDTO.getTerminalNo().length();
        if (needFillZeroCount > 0) {
            for (int i = 0; i < needFillZeroCount; i++) {
                byteBuf.writeByte(0x00);
            }
        }
        return Unpooled.wrappedBuffer(packDefault(commandParamDTO.getDeviceType()), byteBuf);
    }

    /**
     * 读所有终端实时信息
     *
     * @param sn
     * @param commandParamDTO
     * @return
     */
    public static ByteBuf f32(int sn, CommandParamDTO commandParamDTO) {
        ByteBuf byteBuf = Unpooled.buffer(4);
        // DT=> F32
        byteBuf.writeShort(0x8003);
        // SN
        byteBuf.writeShort(sn);
        return Unpooled.wrappedBuffer(packDefault(commandParamDTO.getDeviceType()), byteBuf);
    }

    /**
     * 命令包：默认
     *
     * @param deviceType
     * @return
     */
    private static ByteBuf packDefault(int deviceType) {
        ByteBuf byteBuf = Unpooled.buffer(10);
        // 控制域
        byteBuf.writeByte(0x00);
        // 设备类型
        byteBuf.writeByte(deviceType);
        // 协议版本
        byteBuf.writeShort(0x0100);
        // 主站地址和组地址
        byteBuf.writeShort(0x0000);
        // AFN=0c：请求1类数据
        byteBuf.writeByte(0x0c);
        // 帧序列域SEQ(保留0xff)
        byteBuf.writeByte(0xFF);
        // 信息点DA(暂时使用0x00,0x00)
        byteBuf.writeShort(0x0000);
        return byteBuf;
    }
}
